using Godot;
public class HopperBlock : BlockMaterial
{
    public HopperBlock() : base("hopper")
    {
        SetDisplayName("漏斗");
        SetView(true);
        SetCollide(false);
        RotateMax = 3;
        SetBlockEntityCreate(() => new HopperBlockEntity());
        SetTickEvent(Tick);
    }
    public override bool OnUse(PlayerUseBlockEvent e)
    {
        HopperView Hv = GD.Load<PackedScene>("res://Tscn/Store/HopperView.tscn").Instance<HopperView>();
        Hv.SetBlock(e.block);
        e.player.view.SetOpenView(Hv);
        return true;
    }
    public void Tick(UpdataTickEvent e)
    {
        HopperBlockEntity hbe = (HopperBlockEntity)e.block.blockEntity;
        Store BlockStore = hbe.GetStore();

        if (hbe.tick == 0) hbe.tick = 5;
        if (hbe.tick > 0)
        {
            hbe.tick -= 1;
        }
        if (hbe.tick != 0) return;

        //输入物品
        BlockData top = e.TopBlock();
        if (top != null && top.blockEntity != null)
        {
            Store store = top.blockEntity.GetStore();
            if (store != null)
            {
                if (store.output != null)
                {
                    foreach (int i in store.output)
                    {
                        ItemStack item = store.GetItemStack(i);
                        if (item != null && BlockStore.CanAddItem(item.Copy(1)))
                        {
                            store.SubAmount(i, 1);
                            BlockStore.AddItem(item.Copy(1));
                            break;
                        }
                    }
                }
                else
                {
                    for (int i = 0; i < store.Size; i++)
                    {
                        {
                            ItemStack item = store.GetItemStack(i);
                            if (item != null && BlockStore.CanAddItem(item.Copy(1)))
                            {
                                store.SubAmount(i, 1);
                                BlockStore.AddItem(item.Copy(1));
                                break;
                            }
                        }
                    }
                }
            }
        }
        for (int i = 0; i < BlockStore.Size; i++)
        {
            ItemStack item = BlockStore.GetItemStack(i);
            if (item != null)
            {
                if (e.block.State == 0)
                {
                    BlockData bottom = e.BottomBlock();
                    if (bottom != null && bottom.blockEntity != null)
                    {
                        Store store1 = bottom.blockEntity.GetStore();
                        if (store1 != null)
                        {
                            if (store1.input != null)
                            {
                                if (store1.CanAddItem(item.Copy(1), store1.input))
                                {
                                    store1.AddItem(item.Copy(1), store1.input);
                                    BlockStore.SubAmount(i, 1);
                                    break;
                                }
                            }
                            else
                            {
                                if (store1.CanAddItem(item.Copy(1)))
                                {
                                    store1.AddItem(item.Copy(1));
                                    BlockStore.SubAmount(i, 1);
                                    break;
                                }
                            }
                        }
                    }
                }

                if (e.block.State == 1)
                {
                    BlockData left = e.LeftBlock();
                    if (left != null && left.blockEntity != null)
                    {
                        Store store1 = left.blockEntity.GetStore();
                        if (store1 != null)
                        {
                            if (store1.fuel != null)
                            {
                                if (store1.CanAddItem(item.Copy(1), store1.fuel))
                                {
                                    store1.AddItem(item.Copy(1), store1.fuel);
                                    BlockStore.SubAmount(i, 1);
                                    break;
                                }
                            }
                            else
                            {
                                if (store1.CanAddItem(item.Copy(1)))
                                {
                                    store1.AddItem(item.Copy(1));
                                    BlockStore.SubAmount(i, 1);
                                    break;
                                }
                            }
                        }
                    }
                }
                if (e.block.State == 2)
                {
                    BlockData right = e.RightBlock();
                    if (right != null && right.blockEntity != null)
                    {
                        Store store1 = right.blockEntity.GetStore();
                        if (store1 != null)
                        {
                            if (store1.fuel != null)
                            {
                                if (store1.CanAddItem(item.Copy(1), store1.fuel))
                                {
                                    store1.AddItem(item.Copy(1), store1.fuel);
                                    BlockStore.SubAmount(i, 1);
                                    break;
                                }
                            }
                            else
                            {
                                if (store1.CanAddItem(item.Copy(1)))
                                {
                                    store1.AddItem(item.Copy(1));
                                    BlockStore.SubAmount(i, 1);
                                    break;
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}